package dbservice

import (
	"fmt"
	"src/zeus/dbservice/redislib"
	// "github.com/redis/go-redis/v9"
)

type PlayerMD struct {
	Name    string `redis:"Name"`
	JobID   int    `redis:"RoleJob"`
	ModelID int    `redis:"RoleModel`
}

const (
	PlayerMD_Name      = "Name"
	PlayerMD_RoleJob   = "RoleJob"
	PlayerMD_RoleModel = "RoleModel"
)

type playerUtil struct {
	pid uint64
	MD  PlayerMD
	rd  *redislib.RedisHandleModel
	Key string
}

const (
	Player_Prefix = "Player"
)

func NewPlayer(pid uint64) *playerUtil {
	result := &playerUtil{
		pid: pid,
		rd:  GetSessionRedis(),
		Key: fmt.Sprintf("%s:%d", Player_Prefix, pid),
	}
	return result
}

func (this *playerUtil) SavePlayerMD(md *PlayerMD) error {
	c := this.rd
	defer this.Expire()
	this.MD = *md
	// a := (&this.MD) //= md
	return c.HMSet(c.Ctx, this.Key, this.MD).Err()
}

// func (util *playerUtil) SavePlayer(name string, jobid int, RoleModel int) error {
// 	c := GetSessionRedis()
// 	defer c.Dispose()
// 	_, err := c.Hmset(util.key(), "Name", name, "RoleJob", jobid, "RoleModel", RoleModel)
// 	c.Expire(util.key(), Expire_Time)
// 	return err
// }

func (this *playerUtil) Expire() {
	c := this.rd
	// c := GetSessionRedis()
	// defer c.Dispose()
	c.Expire(c.Ctx, this.Key, Expire_Time)
}

// NickName
func (this *playerUtil) GetNickName() (string, error) {
	if err := this.rd.HMGet(this.rd.Ctx, this.Key, PlayerMD_Name).Scan(&this.MD); err != nil {
		return "", err
	} else {
		return this.MD.Name, nil
	}
	// return redis.String(util.getValue("Name"))
}

// func (util *playerUtil) SetNickName(nickName string) error {
// 	c := GetSessionRedis()
// 	defer c.Dispose()

// 	if reply, err := common.NewString(c.Do("HSETNX", util.key(), "Name", nickName)); err != nil {
// 		return err
// 	} else if reply == 0 {
// 		return fmt.Errorf("nickName existed %s", nickName)
// 	}

// 	return nil
// }

// RoleModel
func (this *playerUtil) GetRoleModel() (int, error) {
	if err := this.rd.HMGet(this.rd.Ctx, this.Key, PlayerMD_RoleModel).Scan(&this.MD); err != nil {
		return 0, err
	} else {
		return this.MD.ModelID, nil
	}
	// return common.NewString(util.getValue("RoleModel"))
}

func (this *playerUtil) GetRoleJob() (int, error) {
	if err := this.rd.HMGet(this.rd.Ctx, this.Key, PlayerMD_RoleJob).Scan(&this.MD); err != nil {
		return 0, err
	} else {
		return this.MD.JobID, nil
	}
	// return common.NewString(util.getValue("RoleJob"))
}

// func (util *playerUtil) GetEquip1MainColor() (string, error) {
// 	return redis.String(util.getValue("Equip1MainColor"))
// }

// func (util *playerUtil) GetEquip1SubColor() (string, error) {
// 	return redis.String(util.getValue("Equip1SubColor"))
// }

// func (util *playerUtil) SetNickName(nickName string) error {
// 	return util.setValue("Name", nickName)
// }

// func (util *playerUtil) SetRoleModel(modelID int) error {
// 	return util.setValue("RoleModel", modelID)
// }

// func (util *playerUtil) SetRoleJob(jobID int) error {
// 	return util.setValue("RoleJob", jobID)
// }

// func (util *playerUtil) SetEquip1MainColor(color string) error {
// 	return util.setValue("Equip1MainColor", color)
// }

// func (util *playerUtil) SetEquip1SubColor(color string) error {
// 	return util.setValue("Equip1SubColor", color)
// }

// func (util *playerUtil) IsPlayerExist() bool {
// 	c := GetSessionRedis()
// 	defer c.Dispose()
// 	r, err := c.Do("EXISTS", util.key())

// 	if err != nil {
// 		return false
// 	}

// 	v, err := redis.Bool(r, nil)
// 	if err != nil {
// 		return false
// 	}
// 	return v

// }

// func (util *playerUtil) getValue(field string) (interface{}, error) {
// 	c := GetSessionRedis()
// 	defer c.Dispose()
// 	return c.Do("HGET", util.key(), field)
// }

// func (util *playerUtil) setValue(field string, value interface{}) error {
// 	c := GetSessionRedis()
// 	defer c.Dispose()
// 	_, err := c.Do("HSET", util.key(), field, value)
// 	return err
// }
